TITL DAI FIRMWARE C614-C7FA V1.0 Rev.1 ORG :C614 * * * **************************** * INPUT HEX NUMBER TO MACC * **************************** * * Reads a sequence of hex digits and converts * them into MACC. * * Entry: C points to input. * Exit: CY=1: There was a digit. * CY=0: No digit. * C points to next input. * ABDEHL preserved. * HCB STC PUSH PSW PUSH D PUSH H CALL :C598 Clear MACC and 00E3-E6 LC120 CALL :C073 Get digit from line SUI :30 ) JC :C590 ) CPI :0A ) Check if hex number JC :C634 ) SUI :07 ) Abort via C590 if not CPI :0A ) JC :C590 ) CPI :10 ) JNC :C590 ) LC121 LXI H,:C63D Addr INT(4) CALL :C641 Insert digit at low end REM MACC JMP :C61B Get next digit * * DATA: * I4 DATA :00 INT (4) DATA :00 DATA :00 DATA :04 * * ENTER HEX DIGIT AT LOW END MACC: * * Entry: HL points to a 4-byte number. * A contains a digit. * Exit: HL = 00E3. * C is incremented, D decremented. * ABE preserved. * LC122 PUSH PSW PUSH B PUSH D RST 4 Copy MACC to reg A,B,C,D DATA :15 ANI :F0 Check if value too high CNZ :C04B Then overflow error POP D POP B POP PSW RST 4 Shift left DATA :6F JMP :C5A7 Add digit to MACC * **************************************** * CONVERT HEX MACC TO ASCII FOR OUTPUT * **************************************** * * Converts a HEX number in MACC into its ASCII * representation into the output buffer. * Not significant leading zeroes are cancelled. * * Exit: BCDEHL preserved. AF corrupted. * Length output string in 00E3. * Output string in 00E4-00EB. * HBC PUSH B PUSH D PUSH H CALL :C68D Get startaddr DECBUF in HL RST 4 Copy MACC to reg A,B,C,D DATA :15 CALL :C66A Convert A,B to ASCII REM into DECBUF MOV A,C MOV B,D CALL :C66A Idem for C,D CALL :C691 Get string length in 00E3 POP H POP D POP B RET REM * Convert 2 hex digits: REM LC123 CALL :C66E Convert 1st digit MOV A,B Get 2nd one LC124 PUSH PSW RAR RAR RAR RAR Shift high nibble in low CALL :C677 Convert it to ASCII POP PSW Restore both nibbles LC125 ANI :0F Low nibble only CPI :0A JC :C680 If 0 < digit < 9 ADI :07 Add 7 for A < digit < F LC126 ADI :30 Convert to ASCII MOV M,A Into DECBUF INX H Incr pointer CPI :30 RNZ Abort if digit <> 0 REM * If 1st digit is zero: REM MOV A,L Get lsbyte buffer pointer CPI :E5 1st digit in buffer? RNZ Abort if not DCX H Else: cancel non-sign. 0's RET REM * Get startaddress output buffer: REM LC127 LXI H,:00E4 Startaddr in HL RET * * CALCULATE LENGTH OF STRING IN OUTPUT BUFFER: * * Entry: L: lobyte of address last digit in buffer. * Exit: BCDEHL preserved. AF corrupted. * Length is stored in 00E3. * LC128 MOV A,L Get lobyte addr last digit SUI :E4 Minus beginaddr CPI :01 ACI :00 Length min. 1 STA :00E3 Store length in DECBUF RET * ***************************************** * RESTORE A, ADD '.' AFTER DIGIT STRING * ***************************************** * * Part of PRTY (C486). * LC129 SUB B Restore A JMP :C531 Move string left 1 pos, REM insert '.' * ************************************** * PRINT CHARACTER, INPUT A TEXT LINE * ************************************** * * Part of Run 'INPUT' (0E3D6). * * Entry: Character in A. * Exit: BC preserved. * PINPLN PUSH B CALL :DD1F Print char; input textline POP B RET * DATA :FF DATA :FF * ********************* * DATA FOR 'RANDOM' * ********************* * RNDA DATA :00 Random number constant A DATA :00 DATA :00 DATA :3B * RNDB DATA :07 Random number constant B DATA :73 DATA :59 DATA :41 * IROR DATA :01 OR mask (FPT (1)) DATA :80 DATA :00 DATA :00 * ***************************** * part of READ BLOCK (D340) * ***************************** * * Exit if no loading errors. * MPT26 XTHL STC CY=1: no error LBK30 POP H POP D POP B RET * ***************** * part of 2E8DE * ***************** * SPT02 CALL :CE91 Go and set screen bits for REM mode 1 JMP :E138 (2) Pop all, ret. * * * ================ *** BANK SWITCHING *** * ================ * * ************************* * MATH. RESTART (RST 4) * ************************* * * This, and the following routines, switch the * paged banks of ROM. They are entered via * RST x; DATA xx instructions. * MARST POP H DI SHLD :0043 Save HL PUSH PSW POP H SHLD :0041 Save PSW MVI H,:40 ROM bank 1 select bits LDA :00D4 Offset of start HW/SW vector * * ROM BANK SWITCHING: * * This routine is generally used by all Restarts * using ROM bank switching. * MRS10 XTHL ADD M Add entry number INX H XTHL MOV L,A Complete entry point address LDA :0040 Old bank select port status PUSH PSW Save it ANI :3F Keep other bits ORA H Add new select bits STA :0040 Update memory STA :FD06 Update port MVI H,:E0 CALL :C6F2 Restore HL, PSW; switch bank REM * Return from switched bank: REM XTHL Return to old bank PUSH PSW MOV A,H Get old bank STA :0040 Reinstate memory STA :FD06 Re-instate port POP PSW POP H RET Return to caller * * SWITCH TO ROM BANK: * * HL and PSW are restored. On exit, the * program switches to the selected ROM bank. * After return from this bank, the program * continues on C6E6. * MRDCL PUSH H LHLD :0041 PUSH H POP PSW Restore A,F LHLD :0043 Restore H,L EI RET Switch to selected bank * ************************** * SCREEN RESTART (RST 5) * ************************** * * From SRS10 also used by RST 1. * SCRST POP H DI SHLD :0043 Save HL PUSH PSW MVI A,:80 ROM bank 2 select bits SRS10 POP H SHLD :0041 Save PSW MOV H,A XRA A JMP :C6CF Switch to new bank * ************************** * UTILITY/ENCODE (RST 1) * ************************** * UTRST POP H DI SHLD :0043 Save HL PUSH PSW MVI A,:C0 ROM bank 3 select bits JMP :C705 Switch to ROM bank 3 * * * =============== *** BASIC HANDLER *** * =============== * * ********* * RESET * ********* * * BASIC entry point. Entry via hardware reset by * means of a bootstrap on the addresslines to C000. * * This section is responsible for all 'once only' * initialisation of the hardware and the software * environment. It initialises pointers to all RAM * areas required, the interrupt system and the * software modules. * *INIT RESET LXI SP,:F900 Init. stackpointer MVI A,:30 ) cassette motors off; STA :0040 ) paddle enable off; STA :FD06 ) select ROM bank 0 CALL :D8FB Init. interrupt system LXI H,:0000 SHLD :02A3 Set for no Basic XRA A STA :0293 RNDLY=0 NOP NOP REM * Init. math.package: REM LXI D,:C7F2 Addr table error vectors LXI H,:DDE0 Addr routine get char/line CALL :C003 Package initialisation REM * Init. screen RAM: REM CALL :C7FB Check available RAM space DCX H Highest RAM address LXI D,:C7E0 Addr screen default data RST 5 DATA :00 Init. screen RAM REM * Init. I/O: REM XRA A CALL :EE8D (0) Init. I/O switching REM (input keyb; output screen REM + RS232) STA :0135 Input from keyboard for REM encoding MVI A,:C0 STA :FFF5 Init. TICC baud rate REM * Init. screen: REM CALL :DAFF Print 'DAI PERSONAL DBL :C7A8 COMPUTER' LHLD :02A5 Get bottom screen RAM LXI D,:097B DAD D Get line mode byte of line REM with 'DAI pC' MVI M,:5F Set for medium resolution LXI D,:FFD0 DAD D Create new line mode byte REM for line with 'COMPUTER' CALL :CEF9 Place 'COMPUTER' on new line MVI D,:0F Nr of blanking lines HD10 CALL :CECF Blank next 15 lines DCR D JNZ :C768 Next line REM * Prepare BASIC: REM CALL :D72D Init. Soundgen/DCEbus/ REM transfer cassette data/ REM set start HEAP/get evt. REM DCE-inputs LXI H,:0100 SHLD :029D HEAP size default value CALL :DEB5 Run 'NEW' MVI A,:10 STA :013D Select cassette port 1 LXI H,:E8C5 (3) Ptr. to ASCII table CALL :D560 Init keyboard pointers CALL :D101 Init string handler MVI A,:00 STA :028F Default number type FPT LXI D,:0275 Begin IMPTAB LXI H,:028F End IMPTAB CALL :DE7C Init. implicit type table REM with 0 (= FPT) EI RST 1 Wait for input keyboard DATA :15 or RS232 NOP LXI H,:C7EE Ptr. to mode 0 colours RST 5 Set text colours DATA :06 REM * Entry from utility: REM RINIT CALL :CEE4 Select ROM bank 0 and print DBL :C7D3 'BASIC V1.0' JMP :C818 Into BASIC monitor * * INITIALISATION SCREEN DATA: * MSGHDR DATA :0D Frigged screen header DATA :0D DATA :0D DATA :0D DATA :0D DATA :0D DATA :20 DATA :44 D DATA :41 A DATA :49 I DATA :20 DATA :50 P DATA :45 E DATA :52 R DATA :53 S DATA :4F O DATA :4E N DATA :41 A DATA :4C L DATA :20 DATA :20 DATA :20 DATA :20 DATA :20 DATA :20 DATA :20 DATA :20 DATA :20 DATA :20 DATA :20 DATA :20 DATA :20 DATA :20 DATA :43 C DATA :4F O DATA :4D M DATA :50 P DATA :55 U DATA :54 T DATA :45 E DATA :52 R DATA :0D DATA :00 * MSGIN DATA :0C DATA :42 B DATA :41 A DATA :53 S DATA :49 I DATA :43 C DATA :20 DATA :56 V DATA :31 1 DATA :2E . DATA :30 0 DATA :0D DATA :00 * * SCREEN INITIALISATION PARAMETERS: * SIPAR DATA :01 Default cursor type DATA :5F Default cursor ASCII value * DATA :05 ) DATA :0F ) Colours COLORT DATA :0F ) during Reset DATA :05 ) * DATA :00 ) DATA :05 ) Default colours DATA :0A ) COLORG DATA :0F ) * DBL :CA01 Addr. memory management REM routine DBL :CA25 Addr. emergency stop routine * STCOL DATA :08 ) DATA :00 ) Default colours DATA :00 ) COLORT DATA :08 ) * * MATH. ERROR ROUTINE VECTORS: * MEVEC DBL :DA1F Addr. Overflow error routine DBL :DA15 Addr. Number out of range REM error routine DBL :C7FA Addr. Return DBL :DA24 Addr. Error routine Division REM by zero * MERET RET Return * * * UNL INIT EQU RESET LST END